home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 June / CHIP Haziran 2001.iso / prog / haziran / 19 / setup.exe / data.z / windrvr_int_thread.pas < prev    next >
Pascal/Delphi Source File  |  2001-04-11  |  2KB  |  93 lines

  1. unit WinDrvr_Int_Thread;
  2.  
  3. interface
  4.  
  5. uses
  6.     Windows,
  7.     windrvr;
  8.  
  9. type
  10.     INT_HANDLER_FUNC = procedure(pData : POINTER);
  11.  
  12.     PWD_INTERRUPT = ^WD_INTERRUPT;
  13.  
  14.     INT_THREAD_DATA = record
  15.         hThread : HANDLE;
  16.         hWD : HANDLE;
  17.         func : INT_HANDLER_FUNC;
  18.         pData : POINTER;
  19.         pInt : PWD_INTERRUPT;
  20.     end;
  21.  
  22.     PINT_THREAD_DATA = ^INT_THREAD_DATA;
  23.  
  24. function InterruptThreadHandler(pData : POINTER) : INTEGER;
  25. function InterruptThreadEnable(phThread : PHANDLE; hWD : HANDLE; pInt : PWD_INTERRUPT; func : INT_HANDLER_FUNC; pData : POINTER) : BOOLEAN;
  26. procedure InterruptThreadDisable(hThread : HANDLE);
  27.  
  28.  
  29. implementation
  30.  
  31. function InterruptThreadHandler(pData : POINTER) : INTEGER;
  32. var
  33.     pThread : PINT_THREAD_DATA;
  34.  
  35. begin
  36.     pThread := PINT_THREAD_DATA (pData);
  37.     while True do
  38.     begin
  39.         WD_IntWait(pThread^.hWD, pThread^.pInt^);
  40.         if pThread^.pInt^.fStopped = 1
  41.            then
  42.             Break;
  43.         pThread^.func(pThread^.pData);
  44.     end;
  45.     InterruptThreadHandler := 0;
  46. end;
  47.  
  48. function InterruptThreadEnable(phThread : PHANDLE; hWD : HANDLE; pInt : PWD_INTERRUPT; func : INT_HANDLER_FUNC; pData : POINTER) : BOOLEAN;
  49. var
  50.     pThread : ^INT_THREAD_DATA;
  51.  
  52. begin
  53.     phThread^ := 0;
  54.  
  55.     WD_IntEnable(hWD, pInt^);
  56.     { check if WD_IntEnable failed }
  57.     if not (pInt^.fEnableOk = 1)
  58.     then
  59.     begin
  60.         InterruptThreadEnable := False;
  61.         Exit;
  62.     end;
  63.  
  64.     GetMem(POINTER(pThread), SizeOf(INT_THREAD_DATA));
  65.     pThread^.func := func;
  66.     pThread^.pData := pData;
  67.     pThread^.hWD := hWD;
  68.     pThread^.pInt := pInt;
  69.     pThread^.hThread := BeginThread (nil, $1000, InterruptThreadHandler, POINTER(pThread), 0, WinDriverGlobalDW);
  70.     phThread^ := HANDLE (pThread);
  71.     InterruptThreadEnable := True;
  72. end;
  73.  
  74. procedure InterruptThreadDisable(hThread : HANDLE);
  75. var
  76.     pThread : PINT_THREAD_DATA;
  77.  
  78. begin
  79.     if hThread <> 0
  80.     then
  81.     begin
  82.         pThread := PINT_THREAD_DATA (hThread);
  83.         WD_IntDisable(pThread^.hWD, pThread^.pInt^);
  84.         WaitForSingleObject(pThread^.hThread, INFINITE);
  85.         CloseHandle(pThread^.hThread);
  86.         Freemem(pThread);
  87.     end;
  88. end;
  89.  
  90. end.
  91.  
  92.  
  93.